15. 빈 생명주기 콜백
15. 빈 생명주기 콜백
빈 생명주기 콜백
- 데이터베이스 커넥션 풀이나 네트워크 소켓 연결 같은 경우 작업 전에 미리 연결을 해놓고 한번에 해제 시켜야한다.
- 즉 객체의 초기화와 종료 작업이 필요하다.
스프링 빈은 다음과 같은 생성 주기를 가진다.
객체 주입 → 의존관계 주입
- 스프링 빈은 객체를 생성하고 의존 관계 주입이 끝나고 나서야 데이터를 사용할 준비가 된다.
- 즉 초기화 작업이 모두 끝나고 호출해야한다.
- 그렇다면 언제 모든 주입이 완료된 시점을 알 수 있을까?
- 스프링은 의존관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해 초기화 시점을 알려주는 다양한 기능을 제공한다. → 초기화 콜백
- 마찬가지로 종료되기 직전에 소멱 콜백을 준다. → 소멸 콜백
스프링 빈의 라이프 사이클
스프링 컨테이너 생성 → 스프링 빈 생성 → 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료
참고 : 객체의 생성과 초기화를 분리
- 단일 책임원칙에 따라야한다.
- 생성과 초기화는 다른다.
- 초기화 : 외부 커넥션 연결 같은 무거운 동작을 생성자에서 하는건 단일 원칙에 어긋난다.
- 즉 생성자에서 하는것보단 객체 생성 부분과 초기화 부분을 나누는 것이 좋다.
스프링은 3가지 방법으로 콜백 지원
인터페이스 기반 ( InitailizingBean, DisposableBean )
- 인터페이스의 메서드를 @override 하면 초기화와 소멸 직전을 알 수 가 있다.
- 초기화 할때 연결 등 초기화 작업수행
단점
- 스프링에 의존적이다.
- 코드 레벨 즉 인터페이스까지 이거 할려고 가져오는건 부담이 된다.
- 외부 라이브러리에는 적용 불가
이러한 방법은 스프링 초창기에 나온 방법이다.
빈 등록 초기화 소멸 메서드
- 설정 정보에 초기화와 소멸 메서드를 지정하는 방법
1
@Bean(initMethod = "초기화 메서드" destroyMehtod = "소멸 메서드")
- 메서드 이름을 이제 자유롭게 쓸 수 있다.
- 스프링에 의존하지 않는다.
- 코드가 아니라 설정 정보 사용, 즉 외부 라이브러리에도 사용 가능
- 종료 메서드를 추론가능하다
close
,destroy
,shutdown
같은 종료 메서드에 대해 이름으로 추론해서 사용한다.- 즉 내가 직접 명시하지 않아도 뭔가 종료 메서드 같아 보이는 이름을 소멸 메서드로 사용한다.
어노테이션 활용 방법
- 스프링 권장 방법
**@PostConstruct
, @PreDestroy
**
- 초기화 할 메서드에 어노테이션 사용
- 스프링에 독립적이기에 다른 컨테이너에서도 자주 사용된다.
- 컴포넌트 스캔과도 잘 어울린다.
- 단점 : 외부 라이브러리에 적용이 불가능하다
- 코드를 고칠수가 없는걸…
정리
- 어노테이션 방식을 사용한다.
- 외부 라이브러리가 초기화나 소멸 작업에 필요하다면 빈 등록 정보에 설정해놓자.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.